#ifndef _MEMLAYOUT_H_
#define _MEMLAYOUT_H_

#ifndef __ASSEMBLER__
#include "types.h"
#endif

// 内存布局常量
#define KERNBASE 0x80000000L        // 内核虚拟地址起始
#define PHYSTOP  (KERNBASE + 128 * 1024 * 1024) // 物理内存顶部

// 页大小相关
#define PGSIZE 4096                 // 字节/页
#define PGSHIFT 12                  // 页大小位移

// 页对齐宏
#define PGROUNDUP(sz)  (((sz)+PGSIZE-1) & ~(PGSIZE-1))
#define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1))

// 设备地址
#define UART0 0x10000000L

// 用户地址空间布局常量（汇编文件需要这些定义）
#ifdef __ASSEMBLER__
// 汇编文件中，PGSIZE需要直接定义
#define MAXVA (1L << (9 + 9 + 9 + 12 - 1))  // MAXVA = 256GB (39位)
#define TRAMPOLINE (MAXVA - 4096)           // 蹦床页面
#define TRAPFRAME (TRAMPOLINE - 4096)       // 陷阱帧页面
#else
// C文件中，可以使用PGSIZE宏
#define MAXVA (1L << (9 + 9 + 9 + 12 - 1))  // MAXVA = 256GB (39位)
#define TRAMPOLINE (MAXVA - PGSIZE)         // 蹦床页面
#define TRAPFRAME (TRAMPOLINE - PGSIZE)     // 陷阱帧页面
#endif

#endif